package com.gthncz;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Demo2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int N = sc.nextInt();
            int[] arr = new int[N];
            for (int i=0; i<N; ++i) {
                arr[i] = sc.nextInt();
            }

            // 1. 层序排序
            Arrays.sort(arr);

            // 2. 计算可能的树种树
            int h=0, p=0, pre=0;
            int nulls, nums;
            long res=1;  // 需要使用 long long, java 中可以用 BigInteger.
            int result = 1;

            while (p<N) {
                // 1) 统计第 h 层节点的个数
                nums = 0;
                while (p<N && arr[p] == h){
                    ++nums;
                    ++p;
                }
                // 2) 计算空节点的个数
                int cur_level = (pre==0?1:2*pre);
                nulls = cur_level - nums;
                res = 1;

                System.out.printf("h: %d, nums: %d, cur: %d\n", h, nums, cur_level);
                // 3) 本层的组合数
                for (int k=cur_level, n=nulls; n>0; --n, --k) {
                    res *= k;
                    res %= (1000000000 + 7);
                }
                for (int n=nulls; n>0; --n) {
                    res /= n;
                }
                // res = res % (100000000 + 7);
                result *= res;
                result = result % (100000000 + 7);
                System.out.printf("h: %d, res: %d\n", h, res);
                // 更新层数
                pre = nums; // 更新为当层实际节点个数
                ++h;
            }
            System.out.printf("%d", result);
        }

    }

}
